package com.sprouting.personal.controller;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sprouting.personal.annotations.ApiIdempotent;
import com.sprouting.personal.interfaces.common.Constant;
import com.sprouting.personal.model.common.ResultJson;
import com.sprouting.personal.model.common.jsr.UpdGroup;
import com.sprouting.personal.model.entity.Config;
import com.sprouting.personal.service.ConfigService;
import com.sprouting.personal.utils.CheckTool;
import com.sprouting.personal.utils.EntityTool;
import com.sprouting.personal.utils.IdTool;
import com.sprouting.personal.utils.NetTool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 个人配置
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2022/8/24 23:46
 */
@RequestMapping("/config")
@RestController
public class ConfigController {

    @Autowired
    private ConfigService configService;

    @Value("${server.port}")
    private String port;


    /**
     * 查询配置列表 - 可以预计配置不会特别多，直接获取全部
     * @return
     */
    @PostMapping("/getConfigList")
    public ResultJson getConfigList(){
        // 查询默认的全局配置信息，本人不一定有全部的配置
        List<Config> configDefaultList = configService.getConfigByUserId(Constant.DefaultValue.STRING);

        // 用户个人的配置
        List<Config> configUserList = configService.getConfigByUserId(StpUtil.getLoginIdAsString());

        // key -> 配置
        Map<String, Config> userMap = new HashMap<>();
        if (CollUtil.isNotEmpty(configUserList)){
            userMap = configUserList.stream().collect(Collectors.toMap(Config::getCode, Function.identity()));
        }

        // 最终返回的数据
        List<Config> resultConfig = new ArrayList<>();
        for (Config config : configDefaultList){
            Config userConfig = userMap.get(config.getCode());
            if (userConfig != null){
                resultConfig.add(userConfig);
            } else {
                // 将默认的数据返回
                resultConfig.add(config);
            }
        }

        return ResultJson.success(resultConfig);
    }

    /**
     * 更新配置，如果是公共配置则添加到私人的配置中
     * @param config 配置信息
     * @return
     */
    @PostMapping("/updConfig")
    @ApiIdempotent
    public ResultJson updConfig(@Validated(UpdGroup.class) Config config){
        // 配置都是内置，不会有新增
        String userId = config.getUserId();
        if (CheckTool.checkNull(userId) || Constant.DefaultValue.STRING.equals(userId)){
            /// 说明是从公共的配置中拷贝过来的，需要进行拷贝到个人配置中
            // 再次检查是否个人存在相同的配置
            Config configDb = configService.getConfigByCode(config.getCode(), StpUtil.getLoginIdAsString());
            if (configDb != null){
                configDb.setValue(config.getValue());
                configDb.setRemark(config.getRemark());
                configService.updateById(configDb);

            } else {
                // 如果等于null并不是要复制保存，有几个特殊的是不进行更新的。这几个特殊的数据有且只有一个唯一
                List<String> codeList = new ArrayList<>();
                codeList.add(Constant.ConfigCode.VIDEO_MAPPING_RESOURCE);
                codeList.add(Constant.ConfigCode.PDF_PATH);
                codeList.add(Constant.ConfigCode.REGISTER_PAGE);
                codeList.add(Constant.ConfigCode.DATABASE_BACKUP);
                if (codeList.contains(config.getCode())){
                    config.setUpdateTime(new Date());
                    config.setUpdateId(StpUtil.getLoginIdAsString());
                    configService.updateById(config);

                } else {
                    config.setId(IdTool.getId());
                    config.setUserId(StpUtil.getLoginIdAsString());
                    EntityTool.buildSaveBase(config, StpUtil.getLoginIdAsString());
                    configService.save(config);
                }
            }

        } else {
            // 更新操作即可
            config.setUpdateTime(new Date());
            config.setUpdateId(StpUtil.getLoginIdAsString());
            configService.updateById(config);
        }

        return ResultJson.success(null);
    }

    /**
     * 获取 druid 的地址
     * @return
     */
    @GetMapping("/getDruidPath")
    public ResultJson getDruidPath(){
        String ip = NetTool.getLocalHostLANAddress();
        String path = "http://%s:%s/druid/login.html";
        path = String.format(path, ip, port);
        return ResultJson.success(path);
    }

}
